#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <QString>
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    isSaved = false; //初始化文件为未保存过状态
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //中文显示
    //curFile = tr(“未命名.txt”); //初始化文件名为“未命名.txt”
    curFile = tr("未命名.txt");
    setWindowTitle(curFile); //初始化主窗口的标题


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::do_file_New() //实现新建文件的功能

{

do_file_SaveOrNot();

isSaved = false;

curFile = tr("未命名.txt");

setWindowTitle(curFile);

ui->textEdit->clear(); //清空文本编辑器

ui->textEdit->setVisible(true); //文本编辑器可见

}


void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框

{

    if(ui->textEdit->document()->isModified()) //如果文件被更改过，弹出保存对话框

    {

    QMessageBox box;

    //box.setWindowTitle(tr(“警告”));
    box.setWindowTitle("警告");

    box.setIcon(QMessageBox::Warning);

    //box.setText(curFile + tr(” 尚未保存，是否保存？”));
    box.setText(curFile + tr("是否保存？"));
    box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);

    if(box.exec() == QMessageBox::Yes) //如果选择保存文件，则执行保存操作

    do_file_Save();

    }

}

void MainWindow::do_file_Save() //保存文件

{

    if(isSaved){ //如果文件已经被保存过，直接保存文件

    saveFile(curFile);

    }

    else{

    do_file_SaveAs(); //如果文件是第一次保存，那么调用另存为

    }

}

void MainWindow::do_file_SaveAs() //文件另存为

{

    //QString fileName = QFileDialog::getSaveFileName(this,tr(“另存为”),curFile);
    QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);
    //获得文件名

    if(!fileName.isEmpty()) //如果文件名不为空，则保存文件内容

    {

    saveFile(fileName);

    }

}

bool MainWindow::saveFile(const QString& fileName)

//保存文件内容，因为可能保存失败，所以具有返回值，来表明是否保存成功

{

QFile file(fileName);

if(!file.open(QFile::WriteOnly | QFile::Text))

//以只写方式打开文件，如果打开失败则弹出提示框并返回

{

QMessageBox::warning(this,tr("保存文件"),

tr("无法保存文件 %1:\n %2").arg(fileName)

.arg(file.errorString()));

return false;

}

//%1,%2表示后面的两个arg参数的值

QTextStream out(&file);   //新建流对象，指向选定的文件

out << ui->textEdit->toPlainText();   //将文本编辑器里的内容以纯文本的形式输出到流对象中

isSaved = true;

curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路径

setWindowTitle(curFile); //将窗口名称改为现在窗口的路径

return true;

}

void MainWindow::do_file_Open()//打开文件

{

    do_file_SaveOrNot();//是否需要保存现有文件

    QString fileName = QFileDialog::getOpenFileName(this);

    //获得要打开的文件的名字

    if(!fileName.isEmpty())//如果文件名不为空

    {

    do_file_Load(fileName);

    }

    ui->textEdit->setVisible(true);//文本编辑器可见

}

bool MainWindow::do_file_Load(const QString& fileName) //读取文件

{

QFile file(fileName);

if(!file.open(QFile::ReadOnly | QFile::Text))

{

QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString()));

return false;      //如果打开文件失败，弹出对话框，并返回

}

QTextStream in(&file);

ui->textEdit->setText(in.readAll());      //将文件中的所有内容都写到文本编辑器中

curFile = QFileInfo(fileName).canonicalFilePath();

setWindowTitle(curFile);

return true;

}

void MainWindow::on_action_New_triggered()
{
    do_file_New();
}

void MainWindow::on_action_Open_triggered()
{
    do_file_Open();
}

void MainWindow::on_action_Close_triggered()
{
    do_file_SaveOrNot();

    ui->textEdit->setVisible(false);
}

void MainWindow::on_action_Save_triggered()
{
    do_file_Save();
}

void MainWindow::on_action_SaveAs_triggered()
{
     do_file_SaveAs();
}

void MainWindow::on_action_Exit_triggered()
{
    on_action_Close_triggered();     //先执行关闭操作
    qApp->quit();    //再退出系统，qApp是指向应用程序的全局指针

}

void MainWindow::on_action_Undo_triggered()
{
    ui->textEdit->undo();
}

void MainWindow::on_action_Cut_triggered()
{
    ui->textEdit->cut();
}

void MainWindow::on_action_Copy_triggered()
{
    ui->textEdit->copy();
}

void MainWindow::on_action_Paste_triggered()
{
    ui->textEdit->paste();
}

void MainWindow::on_action_Find_triggered()
{
    QDialog *findDlg = new QDialog(this);

    //新建一个对话框，用于查找操作，this表明它的父窗口是MainWindow。

    findDlg->setWindowTitle(tr("查找"));

    //设置对话框的标题

    find_textLineEdit = new QLineEdit(findDlg);

    //将行编辑器加入到新建的查找对话框中

    QPushButton *find_Btn = new QPushButton(tr("查找下一个"),findDlg);

    //加入一个“查找下一个”的按钮

    QVBoxLayout* layout = new QVBoxLayout(findDlg);

    layout->addWidget(find_textLineEdit);

    layout->addWidget(find_Btn);

    //新建一个垂直布局管理器，并将行编辑器和按钮加入其中

    findDlg ->show();

    //显示对话框

    connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText()));

    //设置“查找下一个”按钮的单击事件和其槽函数的关联
}
void MainWindow::show_findText()//“查找下一个”按钮的槽函数

{

    QString findText = find_textLineEdit->text();    //获取行编辑器中的内容
    ui->textEdit->find(findText,QTextDocument::FindBackward);
    if(!ui->textEdit->find(findText,QTextDocument::FindBackward))

    {

    //QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText);
        QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText));
    }

}

void MainWindow::on_action_About_triggered()
{
   // myDlg.show();
    about();
}

void MainWindow::about()
{
    QMessageBox::about(this,tr("电子日记本程序1.0版"),
                       tr("<h2>电子日记本1.0版</h2>"
                          "<p>作者：罗大元</p>"
                          "<p>邮箱：luodayuan2@gmail.com</p>"));
}
